#include "class_modbus.h"

class_modbus* class_modbus::handler = nullptr;

class_modbus::class_modbus()
{
    ctx = nullptr;
    // 7. 关闭连接并释放资源
}

class_modbus::~class_modbus()
{
    modbus_close(ctx);
    modbus_free(ctx);
}

uint8_t class_modbus::initModbus()
{
    // 1. 创建 modbus_rtu 上下文
    ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
    if (ctx == nullptr) {
        std::cerr << "无法创建 Modbus RTU 上下文" << std::endl;
        return -1;
    }

    // 2. 设置从站地址
    modbus_set_slave(ctx, 1);  // 从站地址为 1

    // 3. 设置响应超时（可选，单位：微秒）
    modbus_set_response_timeout(ctx, 0, 100000);  // 100毫秒

    // 4. 打开串口设备
    if (modbus_connect(ctx) == -1) {
        std::cerr << "打开串口设备失败: " << modbus_strerror(errno) << std::endl;
        modbus_free(ctx);
        return -1;
    }

    return 1;
}

uint8_t class_modbus::readData()
{
    int rc = modbus_read_registers(ctx, 0, 1, tab_temp);
    if (rc == -1) {
        std::cerr << "读取寄存器失败: " << modbus_strerror(errno) << std::endl;
        return 0;
    } else {
        // std::cout << "成功读取 " << rc << " 个寄存器" << std::endl;
        std::cout << "寄存器地址 0 的值为: " << tab_temp[0] << std::endl;
    }

    rc = modbus_read_registers(ctx, 1, 1, tab_wet);
    if (rc == -1) {
        std::cerr << "读取寄存器失败: " << modbus_strerror(errno) << std::endl;
        return 0;
    } else {
        // std::cout << "成功读取 " << rc << " 个寄存器" << std::endl;
        std::cout << "寄存器地址 1 的值为: " << tab_wet[0] << std::endl;
    }
    std::cout<<std::endl;
    std::cout<<std::endl;

    return 1;
}

uint8_t class_modbus::writeData()
{

    return 1;
}
